import axios, {
    type AxiosProgressEvent,
    type AxiosResponse,
    type AxiosError,
} from "axios";
// import { ElMessage, ElLoading } from "element-plus";
// import { localGet } from "./index";
// import { cancelPending, addPending } from "./cancelRequest";
// import type {
//     TypesGlobalRequest,
//     TypesUploadFile,
//     TypesDownloadFile,
//     TypesUploadFileAndDownloadFile,
//     TypesGetFileBase64,
// } from "./request-types";

// // 请求前拦截
// axios.interceptors.request.use(
//     (config) => {
//         const token = localGet("token");
//         if (token) {
//             config.headers["Token"] = token;
//         }
//         cancelPending(config);
//         addPending(config);
//         return config;
//     },
//     (error) => {
//         return Promise.reject(error);
//     }
// );

// // 响应后处理
// axios.interceptors.response.use(
//     (res) => {
//         // cancelPending(res.config);
//         if (res.data.code == 200) {
//             return res;
//         } else if (res.config.responseType === "blob") {
//             return Promise.resolve(res);
//         } else {
//             ElMessage.error(res.data.msg);
//             return Promise.reject(res);
//         }
//     },
//     (err) => {
//         if (err.message !== "cancel request") {
//             ElMessage.error(err.message);
//         }
//         return Promise.reject(err);
//     }
// );

// /**
//  * http请求
//  */
// export const globalRequest = (
//     opts: TypesGlobalRequest
// ): Promise<AxiosResponse> => {
//     opts.methods = opts.methods || "GET";

//     return new Promise((resolve, reject) => {
//         axios({
//             url: opts.url,
//             method: opts.methods,
//             [opts.methods.toLocaleUpperCase() == "GET" ? "params" : "data"]:
//                 opts.data || {},
//             headers: {
//                 "Content-Type": "application/x-www-form-urlencoded",
//             },
//         })
//             .then((res) => {
//                 resolve(res);
//             })
//             .catch((err: AxiosError) => {
//                 reject(err);
//             });
//     });
// };

/**
 * 上传文件
 */
export const uploadFileRequest = (opts: any) => {
    const file_data = new FormData();
    for (let k in opts.data) {
        if (opts.data[k] === undefined) {
            continue;
        }
        if (k !== "fileinput" && k !== "file") {
            file_data.append(k, opts.data[k] as string);
        } else if (k == "fileinput" && opts.data.fileinput) {
            file_data.append(k, opts.data.fileinput);
        } else if (k == "file" && opts.data.file) {
            file_data.append(k, opts.data.file);
        }
    }

    let loadingInstance = loadingStart();

    return new Promise((resolve, reject) => {
        axios({
            url: opts.url,
            method: opts.methods,
            data: file_data,
            headers: {
                "Content-Type": "multipart/form-data",
            },
            onUploadProgress: (progress) => setPace(progress, loadingInstance),
        })
            .then((res) => {
                loadingInstance.close();
                resolve(res);
            })
            .catch((err) => {
                loadingInstance.close();
                reject(err);
            });
    });
};

// /**
//  * 下载文件
//  */
// export const downloadFileRequest = (opts: TypesDownloadFile) => {
//     let loadingInstance = loadingStart();
//     opts.methods = opts.methods || "GET";

//     return new Promise((resolve, reject) => {
//         axios({
//             url: opts.url,
//             method: opts.methods,
//             [opts.methods.toLocaleUpperCase() == "GET" ? "params" : "data"]:
//                 opts.data || {},
//             headers: {
//                 "Content-Type": "application/x-www-form-urlencoded",
//             },
//             responseType: "blob",
//             onDownloadProgress: (progress) =>
//                 setPace(progress, loadingInstance),
//         })
//             .then((res) => {
//                 let fileName = "";
//                 try {
//                     const matchResult = res.headers?.[
//                         "content-disposition"
//                     ]?.match(/filename='?"?([^'"]+)'?"?$/);
//                     if (matchResult && matchResult[1]) {
//                         fileName = matchResult[1];
//                     }
//                 } catch (err) {}
//                 var reader = new FileReader();
//                 reader.readAsDataURL(res.data); // 转换为base64，可以直接放入a标签href
//                 reader.onload = function (e) {
//                     // console.log('---',e.target.result);			//查看有没有接收到数据流
//                     downloadFileToLocal(
//                         fileName ||
//                             opts?.data?.filename ||
//                             new Date().getTime().toString(),
//                         e.target?.result as string
//                     );
//                     resolve(res);
//                 };
//             })
//             .catch((err) => {
//                 reject(err);
//             });
//     }).finally(() => {
//         loadingInstance.close();
//     });
// };

// /**
//  * 上传后并且下载
//  */
// export const uploadFileAndDownloadFileRequest = (
//     opts: TypesUploadFileAndDownloadFile
// ) => {
//     const filename = opts.data.fileinput
//         ? opts.data.fileinput.name.slice(
//               0,
//               opts.data.fileinput.name.lastIndexOf(".")
//           )
//         : "";
//     const filetype = opts.data.fileinput
//         ? opts.data.fileinput.name.slice(
//               opts.data.fileinput.name.lastIndexOf(".") + 1
//           )
//         : "";
//     const file_data = new FormData();

//     for (let k in opts.data) {
//         if (opts.data[k] && k != "fileinput") {
//             file_data.append(k, opts.data[k]);
//         } else if (k == "fileinput") {
//             file_data.append(k, opts.data.fileinput);
//         }
//     }

//     let loadingInstance = loadingStart();

//     return new Promise((resolve, reject) => {
//         axios({
//             url: opts.url,
//             method: opts.methods,
//             data: file_data,
//             headers: {
//                 "Content-Type": "multipart/form-data",
//             },
//             responseType: "blob",
//             onUploadProgress: (progress) => setPace(progress, loadingInstance),
//             onDownloadProgress: (progress) =>
//                 setPace(progress, loadingInstance),
//         })
//             .then((res) => {
//                 var reader = new FileReader();
//                 reader.readAsDataURL(res.data); // 转换为base64，可以直接放入a标签href
//                 reader.onload = function (e) {
//                     // console.log('---',e.target.result);			//查看有没有接收到数据流
//                     downloadFileToLocal(
//                         filename + new Date().getTime() + "." + filetype,
//                         e.target!.result as string
//                     );
//                     resolve(res);
//                 };
//             })
//             .catch((err) => {
//                 reject(err);
//             })
//             .finally(() => {
//                 loadingInstance.close();
//             });
//     });
// };

// // 下载到本地
// export function downloadFileToLocal(fileName: string, data: string) {
//     const a = document.createElement("a");
//     a.setAttribute("href", data);
//     a.setAttribute("download", fileName);
//     a.setAttribute("target", "_blank");
//     let clickEvent = document.createEvent("MouseEvents");
//     clickEvent.initEvent("click", true, true);
//     a.dispatchEvent(clickEvent);
// }

// /**
//  * 获取文件base64
//  */
// export const getFileBase64Request = (opts: TypesGetFileBase64) => {
//     opts.methods = opts.methods || "GET";

//     return new Promise((resolve, reject) => {
//         axios({
//             url: opts.url,
//             method: opts.methods,
//             [opts.methods?.toLocaleUpperCase() == "GET" ? "params" : "data"]:
//                 opts.data || {},
//             headers: {
//                 "Content-Type": "application/x-www-form-urlencoded",
//             },
//             responseType: "blob",
//         })
//             .then((res) => {
//                 var reader = new FileReader();
//                 reader.readAsDataURL(res.data); // 转换为base64，可以直接放入a标签href
//                 reader.onload = function (e) {
//                     resolve(e.target?.result as string); // 直接得到base64字符串
//                 };
//             })
//             .catch((err) => {
//                 reject(err);
//             });
//     }).finally(() => {});
// };

// // 全屏显示加载中
function loadingStart() {
    return ElLoading.service({
        lock: true,
        spinner: "el-icon-loading",
        background: "rgba(255, 255, 255, 0.5)",
    });
}

// // 加载中的百分比
function setPace(progress: AxiosProgressEvent, loadingInstance: any) {
    let pace = Math.round((progress.loaded / progress.total!) * 100) + "%";
    loadingInstance.setText(pace);
}
